package top.lrshuai.websocket.ws.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;
import top.lrshuai.websocket.ws.entity.WebSocketDTO;
import top.lrshuai.websocket.ws.utils.MessageSender;

/**
 * 处理心跳的
 */
@Slf4j
public class HeartBeatChannelHandler extends ChannelInboundHandlerAdapter {

    private MessageSender messageSender=new MessageSender();

    /**
     * 心跳检测
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent)evt;
            // 有一段时间没有收到任何数据。
            if (event.state() == IdleState.READER_IDLE) {
                log.info("30s没有接收到" + ctx.channel().id().toString() + "客户端的信息了");
                log.info("关闭这个不活跃的channel");
                ctx.close();
            } else if (event.state().equals(IdleState.WRITER_IDLE)) {
                // 有一段时间没有发送数据。
                log.info("给客户端发送心跳包");
                messageSender.sendMessage(ctx.channel(), WebSocketDTO.pong());
            } else if (event.state().equals(IdleState.ALL_IDLE)) {
                // 有一段时间没有接收或发送数据。
                System.out.println("有一段时间没有接收或发送数据。");
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }

}
